package com.swak.utils.bean;

/**
 * 懒加载，需要的时候才会创建实际的转换器;
 * 后续使用 mapstruct 来代替（编译器来生成，且功能更加强大）；
 * @author 618lf
 *
 * @param <DTO>
 * @param <PO>
 */
class LazyBeanCopier<DTO, PO> implements BeanCopier<DTO, PO> {

	BeanCopier<DTO, PO> copier;
	final Class<DTO> theDTO;
	final Class<PO> thePO;
	
	LazyBeanCopier(Class<DTO> theDTO, Class<PO> thePO) {
		this.theDTO = theDTO;
		this.thePO = thePO;
	}

	@Override
	public PO transform(DTO dto) {
		return createBeanCopier().transform(dto);
	}

	@Override
	public DTO convert(PO po) {
		return createBeanCopier().convert(po);
	}

	private BeanCopier<DTO, PO> createBeanCopier() {
		if (copier == null) {
			synchronized (this) {
				if (copier == null) {
					copier = BeanCopiers.createCopier(theDTO, thePO);
				}
			}
		}
		return copier;
	}
}